package pl.elka.pszt.model.argument;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * Klasa pomocnicza przy nadawaniu unikalnych identyfikatorow dla argumentow.
 * 
 * @author Andrzej Makarewicz
 * 
 */
public class ArgumentHelper {
	
	AtomicInteger idGenerator = new AtomicInteger();
	Map<String, Argument> arguments = new HashMap<String, Argument>();
	Map<Integer, String> argumentNames = new HashMap<Integer, String>();
	
	/**
	 * 
	 * @param name
	 * @param type
	 * @return argument o podanej nazwie, tworzony jezeli jeszcze nie istnieje
	 */
	public Argument getOrCreateArgument(String name, Argument.Type type) {
		if (name == null || type == null) throw new NullPointerException();
		
		Argument argument = arguments.get(name);
		if (argument == null) {
			int id = idGenerator.getAndIncrement();
			argument = Argument.createArgument(id, type, this);
			arguments.put(name, argument);
			argumentNames.put(id, name);
		} else if (!argument.getType().equals(type)) {
			throw new IllegalArgumentException();
		}
		
		return argument;
	}
	
	/**
	 * 
	 * @param id
	 * @return argument dla danego id lub <code>null</code> jesli nie wystepuje
	 */
	public Argument getArgumentById(int id) {
		String name = argumentNames.get(id);
		return name == null ? null : arguments.get(name);
	}
	
	/**
	 * 
	 * @param argument
	 * @return nazwa danego argumentu
	 */
	public String getArgumentName(Argument argument) {
		return argumentNames.get(argument.getId());
	}
	
	/**
	 * Czysci mapowania argumentow i nazw, zeruje identyfikatory. Nazelzy
	 * wywolac gdy ladowana jest nowa baza wiedzy.
	 */
	public void clear() {
		idGenerator = new AtomicInteger();
		arguments.clear();
		argumentNames.clear();
	}
}
